package com.weng.bigdata.framework.jdbc.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;

import java.security.MessageDigest;

/**
* JDBC MD5传用
* @author wengzhonghui
* @date: 2021-07-12 16:24:59
*/
@Slf4j
public class MD5JdbcUtil {
    /**
     * MD5加密
     *
     * @param src     需要加密的字符串
     * @param isUpper 大小写
     * @param bit     加密长度（16,32,64）
     * @return
     */
    public static String getMD5(String src, boolean isUpper, Integer bit) {
        String md5 = new String();
        try {
            // 创建加密对象
            MessageDigest md = MessageDigest.getInstance("md5");
            if (bit == 64) {
//                BASE64Encoder bw = new BASE64Encoder();
//                String bsB64 = bw.encode(md.digest(src.getBytes("utf-8")));
//                md5 = new String(bsB64);
                md5 = new String(Base64.encodeBase64((md.digest(src.getBytes("utf-8")))));
            } else {
                // 计算MD5函数
                md.update(src.getBytes());
                byte b[] = md.digest();
                int i;
                StringBuffer sb = new StringBuffer("");
                for (int offset = 0; offset < b.length; offset++) {
                    i = b[offset];
                    if (i < 0){
                        i += 256;
                    }
                    if (i < 16){
                        sb.append("0");
                    }
                    sb.append(Integer.toHexString(i));
                }
                md5 = sb.toString();
                if (bit == 16) {
                    //截取32位md5为16位
                    String md16 = md5.substring(8, 24);
                    md5 = md16;
                    if (isUpper) {
                        md5 = md5.toUpperCase();
                    }
                }
            }
        } catch (Exception e) {
            log.info(e.getMessage(), e);
        }

        if (isUpper) {
            md5 = md5.toUpperCase();
        }
        return md5;
    }

}
